home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
kowin
/
archive
/
sys
/
kowin14d.lzh
/
doc
/
programming
/
common.doc
< prev
next >
Wrap
Text File
|
1995-11-24
|
4KB
|
116 lines
Ko-Window プログラマーズマニュアル
「Common 領域について」
● Common 領域 (または共有領域)
各プロセスから共通にアクセスすることのできるメモリです。それぞれ任意の文字
列による名前をもち、この名前によってどのプログラムでも簡単にその領域をアクセ
スすることができます。
● Common 領域の使われ方
どのプロセスからも平等に参照できるメモリとして、初期設定情報や、プロセス起
動情報の相互参照、Clip Board、または排他的実行におけるロック情報の領域として
用いられます。
● Common 領域の大きさ
Common 領域は、サーバーの HEAP から確保されます。よって確保できるサイズも
サーバーの HEAP 領域の大きさに左右されます。+14 以降はこの Common 領域の管理
システムが改良され、特に個数制限を持つようなことはなくなりました。よって
WSRV.RC の !Wsrv の項目にある「CommonSize」の設定は意味を持ちません。
● Common 領域のアクセス
Common 領域は全部名前がつけられています。この名前は 15 文字以下でなければ
なりません。名前の大文字小文字は明確に区別します。
指定した Common 領域のアドレスを得るには WindowGetCommon( "name", 0 ) を実
行します。もし確保されていればその先頭アドレス、もし確保されていなければ NULL
を返します。
新しく Common 領域を確保するには WindowGetCommon( "name", size ) のように
実行します。"name" という名前で size 分の大きさの領域を確保し、そのアドレス
を返します。
もしすでに同じ名前の領域が確保されていたならば、その領域をいったん開放して
からあらためて size 分だけのメモリを確保しようとします。この時メモリ内容は
size 分だけ転送されますが、当然バッファアドレスは変わることになります。
●実際のアクセス例 -- 共有メモリとしてのアクセス
void *ptr;
ConsoleOpen();
if( !(ptr= WindowGetCommon( CommonName, 0 )) ){
if( !(ptr= WindowGetCommon( CommonName, CommonSize )) )
ConsolePrint( "Common 領域が確保できませんでした\n" );
}
これは、すでに CommonName の領域が確保されているならそのアドレス、もし確保
されていなければ新しく CommonName という名前で CommonSize 分だけ領域を確保し
そのアドレスを ptr に返します。
プロセス間で共通のメモリを参照する場合には、この形式がもっともよく使われま
す。
プログラムの起動を排他的に行いたい場合ならば、すでに指定の名前の領域が存在
すれば起動をあきらめ、もし起動できたなら EventClose 時に後始末のあとにこの共
有領域を WindowResetCommon() によって開放するようにします。
●実際のアクセス例 -- Clip Board へのアクセス
Clip Board の内容は、ウィンドウマネージャーから UserPaste によって受け取る
ことができます。もしプログラム内で、自分から Clip Board の内容を参照したい場
合には、"Clip Board" という名前で共有領域を検索すればいいのです。
unsigned char *cp;
if( cp= WindowGetCommon( "Clip Board", 0 ) ){
:
}
Clip Board にプログラムで文字列を設定するには、次のようにします。
WindowResetCommon( "Clip Board" );
if( cp= WindowGetCommon( "Clip Board", strlen(buf)+1 ) ){
strcpy( cp, buf );
}
これは、いったん Clip Board の内容を開放してから(エラーチェックは不用)、文字
列分だけのバッファを確保し直して、内容転送を行っています。
● Common 領域の初期値
WSRV.RC に「!名前」として記述した内容は、起動後 Common 領域として "名前" で
参照できるようになります。つまり WSRV.RC に記述しているのは、Common 領域の初
期値です。
例えば、WSRV.RC の「!K20」という項目に、KX_Term20 のさまざまな設定を書いて
おいたとすれば、WindowGetCommon( "K20", 0 ) とすることで参照することができま
す。もちろん "Wsrv" という名前で、サーバーの設定値を参照することもできます。
このように、アプリケーションの設定記述領域として使用する場合、共有領域へ簡
単にアクセスできるようにするための Common ライブラリが提供されています。
CommonOpen() でアクセスする Common 領域の名前を与えたあと、CommonGetLine()
や CommonGetWord() によって簡単に文字列を切り出すことができるようになってい
ます。ただし、ライブラリ内部では static 領域をワークとして持っているので、同
時に複数の Common 領域を CommonOpen して参照することはできません。もっとも、
内部では WindowGetCommon() によって実装されているだけに過ぎませんので、問題
はないでしょう。
--
1993/06/22 初期版
1995/11/24 +14でCommonSize設定不要になった
小笠原博之 oga@dgw.yz.yamagata-u.ac.jp
DenDenNET: DEN0006 COR.